package com.iwhalecloud.citybrain.flow.platform.manager.domain.repository;

import java.util.List;

import com.iwhalecloud.citybrain.flow.platform.manager.common.client.HttpFlowRecordsQueryDto;
import com.iwhalecloud.citybrain.flow.platform.manager.common.client.HttpGetTaskDto;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.User;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.monitor.FlowTaskTraceVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.monitor.HttpFlowRecordsQueryVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.monitor.HttpTaskQueryVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.monitor.TaskTraceQueryVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.monitor.HttpFlowNodeRecordsQueryVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.statistics.TaskStatisticsQueryVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.task.TaskCandidateQueryVo;

/**
 * @author lilh
 * @date 2019-07-29 14:47
 */
public interface FlowTaskTraceRepository {

    /**
     * 新增
     *
     * @param entity 实体
     * @return 新增数量
     */
    int insertTaskTrace(FlowTaskTraceVo entity);


    /**
     * 根据实例id获取列表数量
     *
     * @param processInstanceId 流程实例id
     * @return 列表数据
     */
    List<FlowTaskTraceVo> listByProcessInstanceId(String processInstanceId);

    /**
     * 根据任务id获取
     *
     * @param taskId 任务id
     * @return
     */
    FlowTaskTraceVo taskByTaskId(String taskId);


    /**
     * 条件查询列表
     *
     * @param taskStatisticsQueryVo 查询条件
     * @return 列表数据
     */
    List<FlowTaskTraceVo> listTask(TaskStatisticsQueryVo taskStatisticsQueryVo);


    /**
     * 列表查询
     *
     * @param taskTraceQueryVo 查询条件
     * @return 列表
     */
    List<FlowTaskTraceVo> listTaskTraces(TaskTraceQueryVo taskTraceQueryVo);

    List<FlowTaskTraceVo> queryTaskTraces(TaskTraceQueryVo taskTraceQueryVo);
    /**
     * 列表查询
     *
     * @param taskTraceQueryVo 查询条件
     * @return 列表
     */
    List<FlowTaskTraceVo> listTaskTracesWithoutUserCheck(TaskTraceQueryVo taskTraceQueryVo);

    /**
     * 根绝 roleId/orgId/positionId 获取对应的人员名单
     * @param type
     * @param groupId
     * @return
     */
    List<String> listUserNameByGroupIdAndType(String type,String groupId);

    /**
     * 开放给外部接口调用
     *
     * @param taskQueryVo 查询条件
     * @return 任务列表
     */
    List<FlowTaskTraceVo> listTaskTraces(HttpTaskQueryVo taskQueryVo);


    /**
     * 查询包含流程实例信息的任务实例
     *
     * @param taskTraceQueryVo 查询条件
     * @return 列表
     */
    List<FlowTaskTraceVo> listTaskWithProcessVariable(HttpTaskQueryVo taskTraceQueryVo);

    /**
     * 获取运行中的任务列表
     *
     * @param processInstanceId 实例Id
     * @return 运行任务列表
     */
    List<FlowTaskTraceVo> listRunningTaskTraces(String processInstanceId);

    /**
     * 获取已经完成的任务列表，不分页
     *
     * @param processInstanceId 实例id
     * @param taskNodeCode      任务节点编码
     * @return 已完成任务
     */
    List<FlowTaskTraceVo> listCompletedTaskTraces(String processInstanceId, String taskNodeCode);


    /**
     * 根据任务id获取任务信息
     *
     * @param taskId 任务id
     * @return 任务信息
     */
    FlowTaskTraceVo getTaskTraceByTaskId(String taskId);


    /**
     * 更新
     *
     * @param entity 实体
     * @return 是否成功
     */
    boolean updateTaskTraceById(FlowTaskTraceVo entity);

    /**
     * 将状态更新为超时
     *
     * @param taskId 任务id
     */
    void updateStatusToTimeout(String taskId);

    /**
     * 将状态更新为预警
     *
     * @param taskId 任务id
     */
    void updateStatusToWarning(String taskId);

    /**
     * 流程取消后，更新运行中的任务的状态
     *
     * @param processInstanceId 流程实例id
     */
    void updateRunningTaskStatusAfterProcessInstanceCancel(String processInstanceId);

    /**
     * 将状态更新为驳回
     *
     * @param taskId 任务id
     */
    void updateStatusToReject(String taskId);


    /**
     * 将状态更新为驳回，且更新处理人
     *
     * @param taskId 任务id
     * @param userId 处理人Id
     * @param operator 处理人名称
     */
    void updateStatusAndOperator(String taskId, String userId, String operator);

    /**
     * 根据主键删除task
     * @param id
     */
    void deleteByPrimaryKey(String id);

    /**
     * 按照不同的类型解析返回不同的数据对象信息集合
     *
     * @param userInfo
     * @param type
     * @return
     */
    String resolveUserInfo(User userInfo, String type);

    /**
     * 按照不同的类型解析返回不同的数据对象信息List集合
     *
     * @param userInfo
     * @param type
     * @return
     */
    List<String> resolveUserInfoToList(User userInfo, String type);

     int updateAssignInfoByTaskId(FlowTaskTraceVo flowTaskTraceVo);


    /**
     * 查询当前用户用户是否是当前任务的候选人
     * 如果只有TaskId，那么只作为查询任务的接口使用
     * @param taskCandidateQueryVo
     * @return
     */
    FlowTaskTraceVo getFlowTaskByTaskIdAndUser(TaskCandidateQueryVo taskCandidateQueryVo);

    /**
     * 查询用戶对应模板的待办
     * 如果只有ModelKey，那么只作为查询任务的接口使用
     * @param taskCandidateQueryVo
     * @return
     */
    List<FlowTaskTraceVo> getFlowTaskByModelAndUser(TaskCandidateQueryVo taskCandidateQueryVo);

    /**
     * 获取任务列表，不分页
     *
     * @param processInstanceId 实例id
     * @param taskNodeCode      任务节点编码
     */
    List<FlowTaskTraceVo> getFlowTaskTracesByProInsIdAndNode(String processInstanceId, String taskNodeCode);

    /**
     * 获取任务列表，不分页
     *
     * @param processInstanceId 实例id
     * @param taskNodeCode      任务节点编码
     */
    List<FlowTaskTraceVo> getFlowTaskTracesByProInsIdAndNode2(String processInstanceId, String taskNodeCode, String orderBy, String orderRule);

    /**
     * 根据流程实例id和任务状态查找flowTaskTrace
     * @param processInstanceId
     * @param linkStatus
     * @return
     */
    List<FlowTaskTraceVo> getFlowTaskTracesByProInsIdAndLinkStatus(String processInstanceId,String linkStatus);
    /**
     * 批量查询流程审批记录列表
     * @param httpFlowRecordsQueryDto
     * @return
     */
    List<HttpFlowRecordsQueryVo> batchQueryFlowRecords(HttpFlowRecordsQueryDto httpFlowRecordsQueryDto);

    /**
     * 批量查询流程审批记录列表
     * @param httpGetTaskDto
     * @return
     */
    List<HttpFlowNodeRecordsQueryVo> getTaskCodeList(HttpGetTaskDto httpGetTaskDto);


    /**
     * 根据流程id，查询每个节点最近的审批信息（驳回多次，只取最新一次审批结果）
     *
     * @param processInstanceId 流程实例id
     * @return
     */
    List<FlowTaskTraceVo> getAllLastTaskRecords(String processInstanceId);

    /**
     * 根据任务id获取任务信息
     *
     * @param parentId 任务id
     * @return 任务信息
     */
    List<FlowTaskTraceVo> getTaskTraceByParentId(String parentId);

    /**
     * 条件查询列表
     *
     * @param taskStatisticsQueryVo 查询条件
     * @return 列表数据
     */
    List<FlowTaskTraceVo> listTaskWithOutPage(TaskStatisticsQueryVo taskStatisticsQueryVo);
}
